package com.shop.cereshop.app.tencent.im.callback.impl;

import com.alibaba.fastjson2.JSON;
import com.shop.cereshop.app.tencent.im.callback.TimCallbackHandler;
import com.shop.cereshop.commons.tencent.im.model.callback.request.BeforeSendMsgCallbackRequest;
import com.shop.cereshop.commons.tencent.im.model.callback.response.BeforeSendMsgCallbackResponse;
import com.shop.cereshop.commons.tencent.im.model.callback.response.CallbackResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import static com.shop.cereshop.commons.tencent.im.constant.CallbackCommand.C2C_CALLBACK_BEFORE_SEND_MSG;

/**
 * @description: 发单聊消息之前回调处理器,处理 C2C.CallbackBeforeSendMsg
 * @author zdd
 * @date 2025/9/11 10:29
 * @version 1.0
 */
@Slf4j
@Service
public class BeforeSendMsgCallbackImpl implements TimCallbackHandler<BeforeSendMsgCallbackRequest> {

    @Override
    public String getCommand() {
        return C2C_CALLBACK_BEFORE_SEND_MSG;
    }

    // 这里可以注入其他服务，如内容审核服务、数据库服务等
    // @Autowired
    // private ContentModerationService moderationService;

    @Override
    public CallbackResponse handle(BeforeSendMsgCallbackRequest request) {
        log.info("发单聊消息之前回调: From={}, To={}, MsgKey={}, EventTime={}",
                request.getFromAccount(), request.getToAccount(), request.getMsgKey(), request.getEventTime());
        log.info("开始处理. request: {}", JSON.toJSONString(request));
        BeforeSendMsgCallbackResponse response = new BeforeSendMsgCallbackResponse();

        try {
            // 记录日志或同步到其他系统
            logMessage(request);

            // 内容审核示例 (模拟)
            boolean isAllowed = moderateContent(request);
            if (!isAllowed) {
                // 禁止发言
                response.setActionStatus("OK");
                // 1 为拒绝发言
                response.setErrorCode(1);
                response.setErrorInfo("Message contains sensitive content.");
                log.warn("由于敏感内容，邮件被拒绝. MsgKey: {}", request.getMsgKey());
                return response;
            }

            // 静默丢弃示例 (可以根据其他条件判断)
            // if (someCondition) {
            //     response.setActionStatus("OK");
            //     response.setErrorCode(2); // 2 为静默丢弃
            //     response.setErrorInfo("");
            //     return response;
            // }

            // 修改消息内容示例 (例如添加用户等级)
            // modifyMessage(request, response);

            // 默认允许发言, errorCode为0
            log.info("发单聊消息之前回调处理成功. MsgKey: {}", request.getMsgKey());
            return CallbackResponse.success();
        } catch (Exception e) {
            log.error("发单聊消息之前回调处理失败. MsgKey: " + request.getMsgKey(), e);
            // 返回失败应答，腾讯云 IM 后台会认为处理失败，可能会重试（取决于其策略）
            return CallbackResponse.error("Internal server error: " + e.getMessage());
        }
    }

    /**
     * 记录消息日志
     */
    private void logMessage(BeforeSendMsgCallbackRequest request) {
        // 实际生产中，这里可能写入数据库、发送到消息队列、或写入文件日志
        // 示例: 记录到日志文件
        log.debug("发送前记录消息: {}", request);
        // 示例: 假设有一个异步任务处理复杂逻辑
        // asyncTaskExecutor.execute(() -> complexLogProcessing(request));
    }

    /**
     * 模拟内容审核
     * @return true 允许, false 拒绝
     */
    private boolean moderateContent(BeforeSendMsgCallbackRequest request) {
        // 这里应该调用您自己的内容审核服务或逻辑
        // 例如，检查 MsgBody 中的文本是否包含敏感词
//        if (request.getMsgBody() != null) {
//            for (TIMMsgElement item : request.getMsgBody()) {
//                if ("TIMTextElem".equals(item.getMsgType())) {
//                    Object textObj = item.getMsgContent().get("Text");
//                    if (textObj instanceof String text && text.contains("forbidden")) { // 简单示例
//                        return false;
//                    }
//                }
//            }
//        }

        // 默认允许
        return true;
    }

    /**
     * 修改消息内容示例
     * 在响应中设置新的 MsgBody 或 CloudCustomData
     */
    private void modifyMessage(BeforeSendMsgCallbackRequest request, BeforeSendMsgCallbackResponse response) {
        // 例如，在原有消息后添加一个自定义消息元素，显示用户等级
        // 这里只是示例，实际逻辑需根据需求编写

        // 假设我们获取了用户的等级 (实际中可能需要查询数据库)
        String userLevel = "LV5";

        // 创建一个新的自定义消息元素
        // var newMsgBody = new ArrayList<MsgBodyItem>();
        // 如果需要保留原文，可以先复制原文
        // if (request.getMsgBody() != null) {
        //     newMsgBody.addAll(request.getMsgBody());
        // }
        // 添加等级信息
        // var customElem = new MsgBodyItem();
        // customElem.setMsgType("TIMCustomElem");
        // var customContent = new HashMap<String, Object>();
        // customContent.put("Desc", "UserLevel");
        // customContent.put("Data", userLevel);
        // customElem.setMsgContent(customContent);
        // newMsgBody.add(customElem);

        // response.setMsgBody(newMsgBody);

        // 或者修改 CloudCustomData
        // response.setCloudCustomData("{\"level\":\"" + userLevel + "\", \"original\": \"" + request.getCloudCustomData() + "\"}");
    }
    
}
